package cdu.sl.controller;

import cdu.sl.common.domain.Result;
import cdu.sl.domain.dto.CardStudyRecordDTO;
import cdu.sl.domain.dto.FlashcardUpdateDTO;
import cdu.sl.domain.dto.StudySetCreateDTO;
import cdu.sl.domain.dto.StudySetUpdateDTO;
import cdu.sl.domain.vo.StudySetVO;
import cdu.sl.service.StudySetService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 学习集控制器
 */
@Api(tags = "学习集接口")
@Slf4j
@RestController
@RequestMapping("/study-sets")
@RequiredArgsConstructor
public class StudySetController {

    private final StudySetService studySetService;

    /**
     * 创建学习集
     *
     * @param dto 创建学习集DTO
     * @return 创建的学习集
     */
    @ApiOperation("创建学习集")
    @PostMapping
    public Result<StudySetVO> createStudySet(@RequestBody @Validated StudySetCreateDTO dto) {
        log.info("创建学习集 ：{}", dto);
        StudySetVO studySet = studySetService.createStudySet(dto);
        return Result.success("创建学习集成功", studySet);
    }

    /**
     * 根据ID获取学习集详情
     *
     * @param id 学习集ID
     * @return 学习集详情
     */
    @ApiOperation("获取学习集详情")
    @GetMapping("/{id}")
    public Result<StudySetVO> getStudySetById(@PathVariable Long id) {
        log.info("获取学习集详情：{}", id);
        StudySetVO studySet = studySetService.getStudySetById(id);
        return Result.success(studySet);
    }

    /**
     * 修改学习集
     *
     * @param dto 修改学习集DTO
     * @return 修改后的学习集
     */
    @ApiOperation("修改学习集")
    @PutMapping
    public Result<StudySetVO> updateStudySet(@RequestBody @Validated StudySetUpdateDTO dto) {
        log.info("修改学习集:{}", dto);
        StudySetVO studySet = studySetService.updateStudySet(dto);
        return Result.success("修改学习集成功", studySet);
    }

    /**
     * 获取当前用户的所有学习集
     *
     * @return 学习集列表
     */
    @ApiOperation("获取当前用户访问过的所有学习集")
    @GetMapping("/all")
    public Result<List<StudySetVO>> getAllAccessedStudySets() {
        log.info("获取当前用户访问过的所有学习集...");
        List<StudySetVO> studySets = studySetService.getAllAccessedStudySets();
        return Result.success(studySets);
    }


    /**
     * 获取当前用户的所有学习集
     *
     * @return 学习集列表
     */
    @ApiOperation("获取当前用户创建的学习集")
    @GetMapping("/created")
    public Result<List<StudySetVO>> getMyStudySets() {
        log.info("获取当前用户创建的学习集...");
        List<StudySetVO> studySets = studySetService.getMyStudySets();
        return Result.success(studySets);
    }

    /**
     * 更新学习集的访问时间
     *
     * @param id 学习集ID
     * @return 操作结果
     */
    @ApiOperation("更新学习集的访问时间")
    @PutMapping("/{id}/access-time")
    public Result<Void> updateAccessTime(@PathVariable Long id) {
        log.info("更新学习集的访问时间：{}", id);
        studySetService.updateAccessTime(id);
        return Result.success();
    }

    /**
     * 删除学习集
     *
     * @param id 学习集ID
     * @return 操作结果
     */
    @ApiOperation("删除学习集")
    @DeleteMapping("/{id}")
    public Result<Void> deleteStudySet(@PathVariable Long id) {
        log.info("删除学习集：{}", id);
        studySetService.deleteStudySet(id);
        return Result.success();
    }


    /**
     * 根据访问次数 , 获取热门学习集
     *
     * @return 热门学习集列表
     */
    @ApiOperation("获取热门学习集")
    @GetMapping("/hot")
    public Result<List<StudySetVO>> getHotStudySets() {
        log.info("获取热门学习集");
        List<StudySetVO> studySetVOList = studySetService.getHotStudySets();
        return Result.success(studySetVOList);
    }


    /**
     * 修改卡片的学习进度
     * @return
     */
    @ApiOperation("进度跟踪功能")
    @PutMapping("/card")
    public Result progressChecking(@RequestBody CardStudyRecordDTO cardStudyRecordDTO){
        log.info("更新闪卡学习进度:{}",cardStudyRecordDTO);
        studySetService.progressChecking(cardStudyRecordDTO);
        return Result.success();
    }




}
